﻿using System.Collections.Generic;
using System.Transactions;
using Arquitetura.Architectural.Aspect;
using Arquitetura.Architectural.BusinessLogic.Facade;
using Arquitetura.Architectural.Model;
using Arquitetura.BusinessLogic.Process;
using Arquitetura.Model;
using Microsoft.Practices.Unity;

namespace Arquitetura.BusinessLogic.Facade
{
    public class SecretariaFacade : FacadeBase, ISecretariaFacade
    {
        #region Atributo(s)
        private readonly IPessoaProcess m_pessoaProcess;
        #endregion Atributo(s)

        #region Propriedade(s)
        private IPessoaProcess PessoaProcess
        {
            get
            {
                return m_pessoaProcess ?? base.Resolve<IPessoaProcess>();
            }
        }
        #endregion Propriedade(s)

        #region Construtor(es)
        public SecretariaFacade()
        {
            m_pessoaProcess = new PessoaProcess();
        }

        public SecretariaFacade(IPessoaProcess pessoaProcess)
        {
            m_pessoaProcess = pessoaProcess;
        }

        [InjectionConstructor]
        public SecretariaFacade(IUnityContainer unityContainer) : base(unityContainer) { }
        #endregion Construtor(es)

        #region Método(s)
        [Transactioning]
        public Result InserirAluno(Aluno aluno)
        {
            return PessoaProcess.InserirAluno(aluno);
        }

        [Transactioning]
        public Result AlterarAluno(Aluno aluno)
        {
            return PessoaProcess.AlterarAluno(aluno);
        }

        [Transactioning]
        public Result ExcluirAluno(Aluno aluno)
        {
            return PessoaProcess.ExcluirAluno(aluno);
        }

        public Result<Aluno> ConsultarAluno(Aluno aluno)
        {
            return PessoaProcess.ConsultarAluno(aluno);
        }

        public Result<IList<Aluno>> ListarAluno()
        {
            return PessoaProcess.ListarAluno();
        }

        public Result<IList<Aluno>> ListarAluno(Aluno alunoFiltro)
        {
            return PessoaProcess.ListarAluno(alunoFiltro);
        }

        public Result<IList<Aluno>> ListarAluno(Aluno alunoFiltro, int skipCount, int takeCount, string sortExpression)
        {
            return PessoaProcess.ListarAluno(alunoFiltro, skipCount, takeCount, sortExpression);
        }

        public Result<int> ContarAluno(Aluno alunoFiltro)
        {
            return PessoaProcess.ContarAluno(alunoFiltro);
        }
        #endregion Método(s)
    }
}
